package 动态规划.dp声明正序And倒序;

import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.stream.Stream;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/4/9 11:58
 */
public class Note {
    /*
        https://www.zhihu.com/question/464263211/answer/1940236681

         这个问题在我写的《算法竞赛进阶指南》中解释过。期望dp要倒推的原因通常是：初态（起点）唯一，目标状态（终点）不唯一。
         例如：机器人从第一行某个格子开始，随机往左右下三个方向走，走到最后一行的某个格子时，期望路径长度。再比如 SCOI2008 奖励关
         这题，起点唯一，但终点有一些状态不可达的问题。如果正着写，按照期望的定义，还需要求出到每个终点的概率，再加权求和。而倒着写因为起点唯一，概率必为1，就不用再存一个概率的dp数组了，写
         起来更简洁一些。如果起点终点都唯一（例如 绿豆蛙的归宿 这题，保证终点唯一且可达；NOIP2016 换教室，终点对于期望来说实际上是唯一的，
         最后是要求min而不是按概率合并），那就可以正着推了。dp本质上依然是对状态空间的遍历，正着/倒着，循环递推还是记忆化搜索递归，本
         质上都没有区别，只是在有的题目中，某一种写法更简单一些，造成了你觉得“必须要正/倒推”这一错觉。

     */


    public static void main(String[] args) {
//        test28();
//        atomicInteger.decrementAndGet();
        boolean b = atomicInteger.compareAndSet(11, 20);
        System.out.println(b);
        System.out.println(atomicInteger);

    }

    private static void test28() {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer sum = stream.parallel()
                .peek(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer num) {
                        System.out.println(num+Thread.currentThread().getName());
                    }
                })
                .filter(num -> num > 5)
                .reduce((result, ele) -> result + ele)
                .get();
        System.out.println(sum);


    }

    static AtomicInteger atomicInteger = new AtomicInteger(10);

}
